﻿#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>

//C语言结构体
struct stu
{
	int num; //只能定义变量
	char ch;
};

//C++结构体
struct stu
{
	int Add(int a, int b); //声明函数

	void swap(int* left, int* right) //定义函数
	{
		int tmp = *left;
		*left = *right;
		*right = *left;
	}

	int num; //定义变量
};

//格式
class 类名
{
	//类成员函数声明(使用头文件声明与定义分离时声明函数);
	int Print();

	//成员函数定义(实现)
	int Add(int a, int b)
	{
		return a + b;
	}

	//成员变量
	int num;

}; //与结构体一样需要带一个分号

class Test
{
public://从该行开始内容公开，限制区域直到碰到下一个访问限定符
	// 函数/函数声明以及允许用户调用的接口
	// ......


private://从该行开始内容私有
	// 变量/数据-不允许用户接触的函数接口和数据，一般类成员变量都是该限定符
	//......
};

//日期类
class Date
{
public:
	void Input(size_t& year, size_t& month, size_t& day)//函数参数与变量名相似
	{
		cout << "请依次输入年月日" << endl;
		cin >> year;
		cin >> month;
		cin >> day;
	}

private:
	size_t _year; //变量名前加_
	size_t _month;
	size_t _day;
	//size_t是无符号整型
};

//日期类
class Date
{
public:

	Date()//构造函数
		:_year(1970)
		, _month(1)
		, _day(1)
	{}

	void Print()//简单打印日期
	{
		cout << _year << endl;
		cout << _month << endl;
		cout << _day << endl;
	}

private:
	size_t _year;
	size_t _month;
	size_t _day;
	//size_t是无符号整型
};

int main()
{
	Date d1; //实例化Date类
	d1.Print();
}

//创建对象
class Test {} //举例类

int main()
{
	Test t;//实例化类为对象t
	return 0;
}

class Test
{
public:
	Test() :_str("Test num:"), _num(10)
	{}

	void Print()
	{
		cout << _str << _num << endl;
	}

private:
	char _str[15]; //15字节
	int _num; //4字节
};


int main()
{
	Test t;
	cout << "Test:" << sizeof(Test) << endl;
	cout << "t:" << sizeof(t) << endl;
	t.Print();
	return 0;
}

//示例-this指针调用原理
class Test
{
public:
	void Print(Test* const this) //实际上编译器会在函数参数中会隐式定义this指针
	{
		cout << this->_num << endl;
	}
private:
	int _num;
};

int main()
{
	Test t1, t2;
	t1.Print(&t1); //对象调用函数时会将自己的地址隐式传递给函数
	t2.Print(&t2);
	return 0;
}

//证明this指针
class Test
{
public:
	Test(int num = 0) :_num(num)
	{}

	void PrintA() //可以隐式调用成员变量
	{
		cout << "_num = " << _num << endl; //与this->_num效果相同
	}
	void PrintB() //也可以显示使用this指针调用成员变量
	{
		cout << "_num = " << this->_num << endl;
	}
private:
	int _num;
};

int main()
{
	Test t(1);
	t.PrintA();
	t.PrintB();
	return 0;
}

//示例-this指针所解决的问题
class Test
{
public:
	void subtract(const Test& pt) //求两个对象某值的差
	{
		cout << _num - pt._num << endl; //更好的区分对象
	}
private:
	int _num;
};

int main()
{
	Test t1, t2;
	t1.subtract(t2);
	return 0;
}

//示例代码
class Test
{
public:
	Test(int num = 0) :_num(num)
	{}

	void Fun1() //正常调用
	{
		cout << "Fun1被调用！" << endl;
	}
	void Fun2() //崩溃！this空指针访问
	{
		cout << "Fun2被调用！" << " _num = " << _num << endl;
	}

private:
	int _num;
};

int main()
{
	Test* t = nullptr;
	t->Fun1();
	t->Fun2();
	return 0;
}

